function output = my_fillNantByIndex(Data,Index,option)
    % output = fillNantByIndex(Data,Index)
    % -------- 自定义函数 --------
    % 将Index中未提及的Data数据设置为NaN或NaTure。
    % 输入：
    %   Data：数据,支持1-3维矩阵。
    %   Index：索引，可以是线性索引，可以是逻辑索引。需要跟Data同样大小。
	%   opt:
	%   	"NaNTag": 0 or NaN or NaT
    % 输出：
    %   和Data同样大小的矩阵。
    
    arguments
        Data
        Index {mustBeNumericOrLogical}
        option.TimeIndex {mustBeNumericOrLogical} = false
		option.NaNTag  = NaN
    end

    % 如果是时间维度索引，需要先变成跟Data一样大的逻辑矩阵。
    if option.TimeIndex
        Index = Index(:);
        SIZE = size(Data);
        if islogical(Index)
            Index = repmatTimeTo3D(Index,SIZE);
        elseif all(ismember(unique(Index),[0,1]))
            Index = repmatTimeTo3D(logical(Index),SIZE);
        else
            TimeIndex = false(SIZE(3),1);
            TimeIndex(Index) = true;
            Index = repmatTimeTo3D(TimeIndex,SIZE);
        end
    end
    
    if islogical(Index)
        output = setNant(Data,Index,option.NaNTag);
    elseif all(ismember(unique(Index),[0,1]))
        % 如果Index是double数组但全部是0和1，那么需要转化成logical数组
        output = setNant(Data,logical(Index),option.NaNTag);
    else
        Index = getLogicalIndex(Data,Index);
        output = setNant(Data,Index,option.NaNTag);
    end

end

function output = setNant(Data,Index,tag)
% 将index中未提及的部分改成NaN/NaT
output = Data;
if isdatetime(Data) && isnan(tag)
    output(~Index) = NaT;
elseif isdatetime(Data) && isnat(tag)
    output(~Index) = NaT;
elseif class(output) == "double"
    output(~Index) = tag;
else
    output = double(output);
    output(~Index) = tag;
end
end

function output = getLogicalIndex(Data,Index)
    % Index要求是Data矩阵的线性索引
    output = false(size(Data));
    output(Index) = true;
end

function output = repmatTimeTo3D(Time,SIZE)
    output = repmat(Time,1,SIZE(1),SIZE(2));
    output = shiftdim(output,1);
end
